package QianFeng14;

import org.junit.Test;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.EnumSet;

/**
 * 枚举
 * 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个，否则编译器就会报错，
 * 枚举可以让编译器在编译时就可以控制源程序赋给的非法值，使用普通变量的方式在开发阶段无法实现这一目标。
 * 在JDK1.5之后，使用关键字enum定 义一种新的类型，称为枚举类型。
 * 在JDK 1.5之后，对于Set和Map接口而言又增加了两个新的子类: EnumSet、 EnumMap两个类。
 **/
public class EnumDemo {
    public static final int RED = 0x1;
    public static final int GREEN = 0x2;
    public static final int BLUE = 0x3;
    public int color;

    @Test
    public void Test() {
        color = RED;
        color = 4;
    }

    //枚举的使用
    public Color colorEnum;
    @Test
    public void Test2() {
        //colorEnum = Color.RED;
        //colorEnum = Color.GREEN;
        colorEnum = Color.BLUE;
        System.out.println(colorEnum);//BLUE
        System.out.println(colorEnum.name());//BLUE
        System.out.println(colorEnum.ordinal());//2
        System.out.println(colorEnum.toString());//BLUE
        Color[] values = Color.values();
        System.out.println(Arrays.toString(values));
    }

    //枚举的两个子类：EnumSet、EnumMap
    @Test
    public void Test3() {
        EnumSet<Color> set = EnumSet.allOf(Color.class);
        for (Color color : set) {
            System.out.println(color);
        }

        EnumMap<Color, String> map = new EnumMap<>(Color.class);
        map.put(Color.RED, "red");
        map.put(Color.GREEN, "green");
        map.put(Color.BLUE, "blue");
    }

    //枚举的构造方法
    @Test
    public void Test4() {
        System.out.println(Color.RED);//枚举内部对象已经创建好了
        System.out.println(Color.BLUE.getColor());
    }

    //单例模式
    public void Test5() {
        Singleton.SINGLETON.method();
    }
}
